package com.yuelife.market.service.impl;

import com.yuelife.market.dao.MAddressDao;
import com.yuelife.market.entity.MAddress;
import com.yuelife.market.service.MAddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * (MAddress)表服务实现类
 *
 * @author makejava
 * @since 2020-06-16 13:23:01
 */
@Service
public class MAddressServiceImpl implements MAddressService {
    @Autowired
    private MAddressDao mAddressDao;

    /**
     * 通过ID查询单条数据
     *
     * @param uid 用户id
     * @return 实例对象
     */
    @Override
    public MAddress queryById(Integer uid) {
        return this.mAddressDao.queryById(uid);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    @Override
    public List<MAddress> queryAllByLimit(int offset, int limit) {
        return this.mAddressDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param mAddress 实例对象
     * @return 实例对象
     * 还是和修改一样的，增加收货地址的时候，也有可能涉及到设置为默认的情况
     * 涉及到两个SQL语句的操作，所以需要加上一个事务的注解
     */
    @Transactional
    @Override
    public void insert(MAddress mAddress) {
        if (mAddress.getSiteDefault()==1){
            mAddressDao.updateDefaultByUid(mAddress.getUid(),0);
        }
        this.mAddressDao.insert(mAddress);

    }

    /**
     * 修改地址，以及默认地址
     * 如果有修改为默认地址，那么就需要将其他所有的地址先修改为不是默认的，然后这个勾选默认的地址修改了
     * 所以在业务中处理两个操作，先判断有没有修改为默认地址，如果修改了，需要修改所有的地址为不是默认状态的地址，然后再修改此次操作的地址
     * 由于同时涉及了数据库的两个操作，所以加事务注解 @Transcational  不过是在业务层处理
     * @return
     */
    @Transactional
    @Override
    public void update(MAddress mAddress) {
        if (mAddress.getSiteDefault()==1){
            //如果有修改默认地址，首先就在这里将该用户的所有地址都修改为不是默认状态，就是 0 ；
            mAddressDao.updateDefaultByUid(mAddress.getUid(),0);
        }
        //修改收货信息
        this.mAddressDao.update(mAddress);
    }

    /**
     * 通过主键删除数据
     *
     * @param aid 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer aid) {
        return this.mAddressDao.deleteById(aid) > 0;
    }

    /**
     * 查询某个用户所有的收货信息
     * @param uid
     * @return
     */
    @Override
    public List<MAddress> selectAllAddressByUid(Integer uid) {
        return mAddressDao.selectAllAddressByUid(uid);
    }

    @Override
    public MAddress selectByAid(MAddress mAddress) {
        return mAddressDao.selectByAid(mAddress);
    }


}